/**
 * 全局响应状态码枚举
 * 用于统一管理各种响应状态，避免硬编码
 * 所有成功状态都返回 "00000"
 */

export enum ResponseCode {
  // 成功状态 - 所有成功都返回 00000
  SUCCESS = '00000',

  // 客户端错误 (4xx)
  BAD_REQUEST = '40000',           // 请求参数错误
  UNAUTHORIZED = '40100',          // 未授权
  FORBIDDEN = '40300',             // 禁止访问
  NOT_FOUND = '40400',             // 资源不存在
  METHOD_NOT_ALLOWED = '40500',    // 方法不允许
  CONFLICT = '40900',              // 资源冲突
  UNPROCESSABLE_ENTITY = '42200',  // 请求格式正确但语义错误
  TOO_MANY_REQUESTS = '42900',     // 请求过于频繁

  // 服务器错误 (5xx)
  INTERNAL_SERVER_ERROR = '50000', // 服务器内部错误
  NOT_IMPLEMENTED = '50100',       // 功能未实现
  BAD_GATEWAY = '50200',           // 网关错误
  SERVICE_UNAVAILABLE = '50300',   // 服务不可用
  GATEWAY_TIMEOUT = '50400',       // 网关超时

  // 业务错误 (6xx)
  BUSINESS_ERROR = '60000',        // 业务逻辑错误
  VALIDATION_ERROR = '60001',      // 数据验证错误
  DUPLICATE_ERROR = '60002',       // 数据重复错误
  PERMISSION_ERROR = '60003',      // 权限不足
  RESOURCE_EXPIRED = '60004',      // 资源已过期
  RATE_LIMIT_ERROR = '60005',      // 限流错误

  // 第三方服务错误 (7xx)
  EXTERNAL_SERVICE_ERROR = '70000', // 外部服务错误
  API_TIMEOUT = '70001',            // API超时
  API_RATE_LIMIT = '70002',         // API限流
  API_QUOTA_EXCEEDED = '70003',     // API配额超限

  // 文件相关错误 (8xx)
  FILE_ERROR = '80000',             // 文件操作错误
  FILE_NOT_FOUND = '80001',         // 文件不存在
  FILE_TOO_LARGE = '80002',         // 文件过大
  FILE_TYPE_NOT_ALLOWED = '80003',  // 文件类型不允许
  UPLOAD_FAILED = '80004',          // 上传失败

  // 数据库相关错误 (9xx)
  DATABASE_ERROR = '90000',         // 数据库错误
  CONNECTION_ERROR = '90001',       // 连接错误
  QUERY_ERROR = '90002',            // 查询错误
  TRANSACTION_ERROR = '90003',      // 事务错误
  CONSTRAINT_VIOLATION = '90004',   // 约束违反
}

/**
 * 响应状态码描述映射
 */
export const ResponseCodeMessage: Record<ResponseCode, string> = {
  [ResponseCode.SUCCESS]: '操作成功',

  // 客户端错误
  [ResponseCode.BAD_REQUEST]: '请求参数错误',
  [ResponseCode.UNAUTHORIZED]: '未授权访问',
  [ResponseCode.FORBIDDEN]: '禁止访问',
  [ResponseCode.NOT_FOUND]: '资源不存在',
  [ResponseCode.METHOD_NOT_ALLOWED]: '请求方法不允许',
  [ResponseCode.CONFLICT]: '资源冲突',
  [ResponseCode.UNPROCESSABLE_ENTITY]: '请求格式正确但语义错误',
  [ResponseCode.TOO_MANY_REQUESTS]: '请求过于频繁，请稍后重试',

  // 服务器错误
  [ResponseCode.INTERNAL_SERVER_ERROR]: '服务器内部错误',
  [ResponseCode.NOT_IMPLEMENTED]: '功能未实现',
  [ResponseCode.BAD_GATEWAY]: '网关错误',
  [ResponseCode.SERVICE_UNAVAILABLE]: '服务暂时不可用',
  [ResponseCode.GATEWAY_TIMEOUT]: '网关超时',

  // 业务错误
  [ResponseCode.BUSINESS_ERROR]: '业务逻辑错误',
  [ResponseCode.VALIDATION_ERROR]: '数据验证失败',
  [ResponseCode.DUPLICATE_ERROR]: '数据已存在',
  [ResponseCode.PERMISSION_ERROR]: '权限不足',
  [ResponseCode.RESOURCE_EXPIRED]: '资源已过期',
  [ResponseCode.RATE_LIMIT_ERROR]: '操作过于频繁，请稍后重试',

  // 第三方服务错误
  [ResponseCode.EXTERNAL_SERVICE_ERROR]: '外部服务错误',
  [ResponseCode.API_TIMEOUT]: '外部服务超时',
  [ResponseCode.API_RATE_LIMIT]: '外部服务限流',
  [ResponseCode.API_QUOTA_EXCEEDED]: '外部服务配额超限',

  // 文件相关错误
  [ResponseCode.FILE_ERROR]: '文件操作失败',
  [ResponseCode.FILE_NOT_FOUND]: '文件不存在',
  [ResponseCode.FILE_TOO_LARGE]: '文件大小超出限制',
  [ResponseCode.FILE_TYPE_NOT_ALLOWED]: '文件类型不允许',
  [ResponseCode.UPLOAD_FAILED]: '文件上传失败',

  // 数据库相关错误
  [ResponseCode.DATABASE_ERROR]: '数据库操作失败',
  [ResponseCode.CONNECTION_ERROR]: '数据库连接失败',
  [ResponseCode.QUERY_ERROR]: '数据库查询失败',
  [ResponseCode.TRANSACTION_ERROR]: '数据库事务失败',
  [ResponseCode.CONSTRAINT_VIOLATION]: '数据库约束违反',
};

/**
 * 判断状态码是否为成功状态
 * @param code 状态码
 * @returns 是否为成功状态
 */
export function isSuccessCode(code: string): boolean {
  return code === ResponseCode.SUCCESS;
}

/**
 * 判断状态码是否为客户端错误
 * @param code 状态码
 * @returns 是否为客户端错误
 */
export function isClientErrorCode(code: string): boolean {
  return code.startsWith('4') || code.startsWith('6');
}

/**
 * 判断状态码是否为服务器错误
 * @param code 状态码
 * @returns 是否为服务器错误
 */
export function isServerErrorCode(code: string): boolean {
  return code.startsWith('5') || code.startsWith('7') || code.startsWith('8') || code.startsWith('9');
}

/**
 * 获取状态码对应的描述信息
 * @param code 状态码
 * @returns 状态码描述
 */
export function getCodeMessage(code: string): string {
  return ResponseCodeMessage[code as ResponseCode] || '未知错误';
}
